/**
 * 消息总线
 * @author luguoxiang
 * @date 2021-09-07
 * 开源项目：https://gitee.com/lgx1992/lg-soar 求star！请给我star！请帮我点个star！
 */
import { onMounted, onDeactivated } from 'vue';

// 根据需要添加事件类型
type BusType = 'updateTitle' | 'appVisibility' | 'refreshTab' | 'closeTab';

type BusListener = (data?: any) => void;
const bus: { [k: string]: BusListener[] } = {};

/**
 * 监听事件
 * @param type
 * @param listener
 */
export function on(type: BusType, listener: BusListener) {
  if (!bus[type]) {
    bus[type] = [];
  }
  onMounted(() => {
    if (!bus[type].includes(listener)) {
      bus[type].push(listener);
    }
  });
  onDeactivated(() => {
    off(type, listener);
  });
}

/**
 * 取消事件监听
 * @param type
 * @param listener
 */
export function off(type: BusType, listener: BusListener) {
  if (bus[type]) {
    const index = bus[type].indexOf(listener);
    if (index !== -1) {
      bus[type].splice(index, 1);
    }
  }
}

/**
 * 发布事件
 * @param type
 * @param data
 */
export function emit(type: BusType, data?: any) {
  if (bus[type]) {
    bus[type].forEach((listener) => listener(data));
  }
}

/**
 * 全局监听事件（*慎用，当无法使用on函数时使用）
 * @param type
 * @param listener
 */
export function listener(type: BusType, listener: BusListener) {
  if (!bus[type]) {
    bus[type] = [];
  }
  if (!bus[type].includes(listener)) {
    bus[type].push(listener);
  }
}
